<?php

namespace Sharks\Core\LifeCycle;

/**
 * 事件
 */
class Event {

	private static $events = null;
	private static $cached = null;
	
	/**
	 * 监听事件
	 * @param  string $event    事件名称
	 * @param  object $provider 处理器
	 */
	public static function listen($event, $provider) {
		if (is_null(self::$events)) {
			self::$events = array();
		}

		if (!isset(self::$events[$event])) {
			self::$events[$event] = array();
		}

		self::$events[$event][] = $provider;

	}

	/**
	 * 执行监听委托
	 * @param  string 	$e      事件名称
	 * @param  object 	$source 事件发生源
	 */
	public static function fire($event) {
		if (is_null(self::$events)) {// 事件集为空
			self::$events = array();
			return;
		}

		$args = func_get_args();

		if (isset(self::$events[$event])) {
			foreach (self::$events[$event] as $provider) {

				if (is_null(self::$cached)) {// 缓存为空

					$p = new $provider;
					call_user_func_array(array($p, 'handle'), $args);

					self::$cached = array();
					self::$cached[$provider] = $p;
				}
				elseif (!isset(self::$cached[$provider])) {// 缓存不为空，但目标不在缓存中
					$p = new $provider;
					call_user_func_array(array($p, 'handle'), $args);

					self::$cached[$provider] = $p;
				}
				else {// 缓存不为空，且目标在缓存中
					call_user_func_array(array(self::$cached[$provider], 'handle'), $args);
				}
			}
		}
	}

	/**
	 * 所有事件
	 * @return array 所有事件
	 */
	public static function events() {
		if (is_null(self::$events)) {
			self::$events = array();
		}
		return self::$events;
	}

	/**
	 * 事件处理器
	 * @param  string $name 
	 * @return array  事件处理器
	 */
	public static function event($name) {
		if (is_null(self::$events)) {
			return null;
		}
		return isset(self::$events[$name]) ? self::$events[$name] : null;
	}

	public static function setEvents(array $events = array()) {
		self::$events = $events;
	}
}